package com.cskaoyan.javase.oop1._11static._1basic;

/**
 * 访问类的静态成员变量,完全和对象没关系,静态成员变量的开辟空间,赋值等也和创建对象的过程没关系
 * 静态成员的访问并不依赖于创建对象，可以直接通过类名访问，其原因在于：
 * 随着类加载完毕，静态成员就存在，并且能够使用了！
 *      1.静态成员变量在类加载过程中完成默认初始化具有默认值，然后进行一些其它赋值，类加载结束就可以访问了。
 *          静态成员变量的赋值也是先进行默认初始化，然后考虑其它赋值手段。
 *      2.静态成员方法的二进制指令集合在类加载过程也准备完毕，可以调用了。
 * 静态成员依赖于类加载的过程完成初始化.
 *
 * 思考以下几个问题:
 *      1.为什么访问静态成员不需要创建对象呢?
 *          静态成员的使用只需要依赖类加载就可以了,和创建对象是没有关系的
 *          类加载在前,创建对象在后
 *      2.(重要)类加载只有一次,那么某个类的静态成员变量有几份呢?
 *          一份
 *          静态成员变量属于类,且独一份,被全体对象所共享
 *          所以静态成员变量,有些人会称呼它为"全局变量",因为它在整个类的全局是唯一的变量
 *
 *      3.静态成员依赖于类加载的过程,那么访问类的静态成员,会触发该类的类加载吗?
 *          会
 *          类加载的时机:
 *          a.new对象
 *          b.启动main方法
 *          c.访问静态成员(变量/方法)
 *
 *
 * @since 15:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(Cat.color);
        Cat.color = "红色";
        System.out.println(Cat.color);
        Cat.test();
    }
}

class Cat {
    static String color = "橘色";

    public static void test(){
        System.out.println("猫!");
    }
}